// 添加全局错误处理（移至顶部以捕获模块加载错误）
process.on('uncaughtException', (err) => {
  console.error('未捕获的异常:', err);
  process.exit(1);
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason);
});

const express = require('express');
const cors = require('cors');
const fs = require('fs');
const path = require('path');
const { generateAudio } = require('./generateAudio');

const app = express();
const PORT = 3001;

// 配置CORS以允许前端访问音频
app.use(cors({ 
  origin: 'http://localhost:5174', 
  exposedHeaders: ['Content-Type'] 
}));

// 全局请求日志
app.use((req, res, next) => {
  console.log(`[GLOBAL] 收到请求: ${req.method} ${req.originalUrl}`);
  next();
});

// 解析JSON请求体
app.use(express.json());

// 创建必要的音频目录（如果不存在）
const audioDir = path.join(__dirname, 'audio');
const pianoAudioDir = path.join(audioDir, 'piano');
[audioDir, pianoAudioDir].forEach(dir => {
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir, { recursive: true });
    console.log(`创建目录: ${dir}`);
  }
});

// 静态文件服务，提供生成的音频文件
app.use('/audio', express.static(audioDir));

// 导入并挂载钢琴路由（只挂载一次）
const pianoRoutes = require('./routes/piano');
app.use('/api/piano', pianoRoutes);

// 通用音频生成API端点
app.post('/generate-audio', async (req, res) => {
  try {
    const { frequency, type = 'piano' } = req.body;
    
    // 严格验证频率参数（确保基频有效）
    if (frequency === undefined || frequency === null) {
      return res.status(400).json({ 
        success: false,
        error: '缺少频率参数（frequency）' 
      });
    }
    
    const freqNum = Number(frequency);
    if (isNaN(freqNum) || freqNum <= 0 || !isFinite(freqNum)) {
      return res.status(400).json({ 
        success: false,
        error: '无效的频率值',
        details: `请提供大于0的有效数字，收到: ${frequency}`
      });
    }
    
    // 生成音频文件，明确指定目录确保基频正确处理
    const outputDir = type === 'piano' ? pianoAudioDir : audioDir;
    const fileName = await generateAudio(freqNum, outputDir, type);
    
    if (!fileName) {
      throw new Error('音频生成函数未返回有效文件名');
    }
    
    // 验证文件是否实际生成
    const filePath = path.join(outputDir, fileName);
    if (!fs.existsSync(filePath)) {
      throw new Error(`音频文件生成失败，文件不存在: ${filePath}`);
    }
    
    // 返回音频文件的URL
    res.json({
      success: true,
      audioUrl: `http://localhost:${PORT}/audio/${type}/${fileName}`,
      fileName: fileName,
      frequency: freqNum, // 返回实际使用的频率，确认基频正确
      filePath: filePath
    });
  } catch (error) {
    console.error('生成音频时出错:', {
      frequency: req.body?.frequency,
      error: error.message,
      stack: error.stack
    });
    res.status(500).json({ 
      success: false,
      error: '生成音频失败',
      details: error.message,
      stack: process.env.NODE_ENV === 'development' ? error.stack : undefined
    });
  }
});

// 启动服务器
const server = app.listen(PORT, '0.0.0.0', () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
  console.log(`钢琴音频目录: ${pianoAudioDir}`);
});

// 保持进程活跃
setInterval(() => {}, 1000);

// 确保服务器正常关闭
process.on('SIGINT', () => {
  server.close(() => {
    console.log('服务器已关闭');
    process.exit(0);
  });
});

process.on('SIGTERM', () => {
  server.close(() => {
    console.log('服务器已关闭');
    process.exit(0);
  });
});
